package com.woniu.controller;

import cn.dev33.satoken.util.SaResult;
import cn.hutool.json.JSONUtil;
import com.woniu.entity.VaTask;
import com.woniu.entity.dto.VaTaskWithUserIds;
import com.woniu.service.RelUserTaskService;
import com.woniu.service.VaTaskService;
import com.woniu.util.ResponseData;
import com.woniu.utils.UploadMinioUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import cn.hutool.json.ObjectMapper;

import java.util.Arrays;
import java.util.List;

/**
 * @ClassName VaTaskController
 * @Description 作业相关接口
 * @Author nanqiao
 * @Date 2025/6/17 9:56
 * @Version 1.0
 */
@RestController
@RequestMapping("/task")
public class VaTaskController {

    @Autowired
    private VaTaskService vaTaskService;

    @Autowired
    private RelUserTaskService relUserTaskService;
    @Autowired
    private UploadMinioUtil uploadMinioUtil;
    /**
     * 根据创建人查询所有 taskId
     */
    @GetMapping("/bycreator")
    public ResponseData<List<Integer>> getTaskIdsByCreator(@RequestParam("creator") String creator) {
        List<Integer> taskIds = vaTaskService.getTaskIdsByCreator(creator);
        return ResponseData.ok(taskIds);
    }
    /**
     * 新增作业接口
     *@Author nanqiao
     * @param
     * @return 是否新增成功
     */
    @PostMapping
    public Mono<ResponseData> addVaTask(
            @RequestPart("dto") String dtoJson,
            @RequestPart(value = "file") FilePart file
    ) {
        // 使用 Hutool 的 JSONUtil 反序列化
        VaTaskWithUserIds dto = JSONUtil.toBean(dtoJson, VaTaskWithUserIds.class);
        VaTask vaTask = dto.getVaTask();
        List<Integer> userIds = dto.getUserIds();

        // 如果有上传文件，则先上传并设置 taskUrl
        if (file != null && !file.filename().isEmpty()) {
            return uploadMinioUtil.addDocuments(file)
                    .doOnError(e -> {
                        // 记录具体的错误信息和堆栈跟踪
                        e.printStackTrace();
                        System.err.println("文件上传失败: " + e.getMessage());
                        System.err.println("堆栈跟踪: " + Arrays.toString(e.getStackTrace()));
                    })
                    .map(url -> {
                        vaTask.setTaskUrl(url); // 设置 taskUrl 为上传后的 MinIO 地址
                        boolean result = vaTaskService.save(vaTask);
                        if (result && userIds != null && !userIds.isEmpty()) {
                            relUserTaskService.saveBatchByTaskId(vaTask.getTaskId(), userIds);
                        }
                        return ResponseData.ok(result); // ResponseData<Boolean>
                    })
                    .onErrorReturn(ResponseData.fail(500, "文件上传失败")); // 返回 ResponseData<Boolean>
        } else {
            // 没有上传文件时直接保存作业信息
            boolean result = vaTaskService.save(vaTask);
            // 如果存在用户ID列表，才添加中间表记录
            if (result && userIds != null && !userIds.isEmpty()) {
                relUserTaskService.saveBatchByTaskId(vaTask.getTaskId(), userIds);
            }
            return Mono.just(ResponseData.ok(result));
        }
    }

    /**
     * 通过用户ID查询关联的任务
     * 新增接口用于前端根据登录用户ID获取有权限的任务
     * @param userId 用户ID
     * @return 任务列表
     */
    @GetMapping("/listByUserId")
    public SaResult listByUserId(@RequestParam Integer userId) {
        // 参数校验，返回明确的错误信息
        if (userId == null) {
            return SaResult.error("用户ID不能为空");
        }
        List<VaTask> tasks = vaTaskService.listByUserId(userId);
        return SaResult.ok().setData(tasks);
    }
}